昨天談到了零知識證明與區塊鏈之間的關係,還沒看的可以點擊這裡觀看,而在看區塊鏈上零知識證明的相關產品常常會說他們的技術使用到了zk-SNARKs,這個zk-SNARKs到底是何方神聖呢?他其實就只是幾個單字的縮寫,他的全名是Zero Knowledge Succinct Non-interactive Argument of Knowledge,雖然我不知道他為什麼不叫zk-SNAK,但是從他的全名中不難發現裡面有出現Zero Knowledge(零知識)與Non-interactive(非交互)的字眼,所以從他的全名便能知曉,他其實就是眾多非交互式零知識證明中的其中一種,那為什麼大家常常選擇使用zk-SNARKs而不是其他的呢?原因就藏在他名字的 Succinct(簡潔) 中。
zk-SNARKs其實是從可驗證計算(Verifiable Computing)中發展出來的,所謂的可驗證計算想要解決的題目是這樣子的:
假如我想計算一個題目,可是我的電腦太爛了,如果用我的電腦要跑出解這個題目的程式會需要跑好幾個月,我聽說阿明那邊有一台超強的電腦,跑這個程式只需要幾天就可以完成,於是我就找到阿明,並且把題目跟程式交給阿明,請他幫我用他的電腦來跑我的程式來計算題目,幾天後,阿明把他算出來的結果交還給我,可是我突然意識到一個問題,我沒辦法確認阿明給我的答案是否就是我想計算的結果,如果我要進行驗算的話,我只能用我的電腦跑程式一次,接著將跑出來的輸出跟阿明給我的答案做比對,看看是不是一樣的,但如果要這樣做的話,那我乾脆直接用我的電腦算就好了啊!於是這麼時候便需要「可驗證計算」,經過問題的轉換,我可以很快的驗證阿明給我的答案到底是不是對的。
可驗證計算發展到後來,發現只要在裡面加入零知識的特性,就可以做到非交互式零知識證明的效果,於是zk-SNARKs就被發明出來了,由於他是從可驗證計算演化來的,因此,驗證者可以很快的驗證出證明者提出的證明,因為可驗證計算本來就是在搞這個的,他們概念是相通的,這也就是zk-SNARKs中Succinct這個字的由來,那驗證證明的速度可以到多快?基本上在zk-SNARKs中驗證證明的時間可以比算出證明的時間少一個維度。
驗證時間超少有什麼優勢呢?讓我們來回想昨天所講的非交互式零知識證明跟區塊鏈的關係,區塊鏈提供了公開的公佈欄給證明者丟出證明,同時間也提供了大量的礦工當作是驗證者來驗證,可是問題就出在礦工驗證這件事情,基本上礦工只會檢查交易內容是否有錯,並不會特別檢查交易以外的訊息,所以其實我這裡要說的區塊鏈其實是指 「以太坊」 ,以太坊是個特別的區塊鏈,我們可以在上面執行程式,如果我寫了一個驗證零知識證明的程式丟上去,之後我如果呼叫該程式的時候,輸入帶入我的證明的時候會發生什麼事?沒錯,每個節點的礦工就真的成為驗證你證明的驗證者了,但是在以太坊上執行程式是需要付給礦工手續費的,收費標準是按照你寫的程式的複雜程度以及使用的空間大小來收取的,然而zk-SNARKs驗證的時間超快,因此程式也相當簡單,所以使用zk-SNARKs時,付出的手續費相對而言會少非常多,這也是為什麼在區塊鏈上大多使用的非交互式零知識證明都是zk-SNARKs,因為他本身便自帶有省錢的優勢。
講完了zk-SNARKs的基本介紹以及為什麼他那麼受歡迎的原因之後,我想來談談,如果要透過zk-SNARKs做零知識證明,他的流程會長什麼樣子?那麼我們明天來談談zk-SNARKs的流程以及他的三個演算法。